// Copyright 2013 Ronald Schlenker, www.technewlogic.de.
// 
// This file is part of Byond.
// 
// Byond is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
// 
// Byond is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with Byond.  If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Diagnostics;

namespace Byond.AudioMidi
{
	public sealed class RuntimeInfo
	{
		private readonly Stopwatch _audioPerformanceStopwatch = new Stopwatch();
		private readonly Stopwatch _uiPerformanceStopwatch = new Stopwatch();

		private DateTime _lastUiStart;
		private double _lastUiCycleTime;

		public event Action VoicesCountChanged;

		public double AudioCpuLoad { get; private set; }
		public double UiCpuLoad { get; private set; }

		private int _voicesCount;
		public int VoicesCount
		{
			get { return _voicesCount; }
			set
			{
				_voicesCount = value;
				if (VoicesCountChanged != null)
					VoicesCountChanged();
			}
		}

		public void StartAudioPerformanceMeasure()
		{
			_audioPerformanceStopwatch.Restart();
		}

		public void StopAudioPerformanceMeasure(int cycles, double sampleRate)
		{
			_audioPerformanceStopwatch.Stop();
			var secondsPerCycle = _audioPerformanceStopwatch.Elapsed.TotalSeconds / cycles;
			var maxCycleTimeInSeconds = 1 / sampleRate;
			AudioCpuLoad = secondsPerCycle / maxCycleTimeInSeconds;
		}

		public void StartUiPerformanceMeasure()
		{
			var startToStartTime = (DateTime.Now - _lastUiStart).TotalMilliseconds;
			UiCpuLoad = _lastUiCycleTime / startToStartTime;

			_lastUiStart = DateTime.Now;
			_uiPerformanceStopwatch.Restart();
		}

		public void StopUiPerformanceMeasure()
		{
			_uiPerformanceStopwatch.Stop();
			_lastUiCycleTime = _uiPerformanceStopwatch.ElapsedMilliseconds;
		}
	}
}